﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SGAEntidades;
using SGABDUtil;
using SGAInterfaces;

namespace SGAAccesoDatos
{
    public class SolicitudTelefonia : ISolicitudTelefonia
    {
        #region Miembros de ISolicitudTelefonia

        public IList<SolicitudTelefoniaInfo> Listar(SolicitudTelefoniaInfo oSolicitudTelefonia)
        {
            var sqlParm = new SqlParameter[7];
            var oListaSolicitudTelefonia = new List<SolicitudTelefoniaInfo>();

            sqlParm[0] = new SqlParameter("@Id_Solicitud_Telefonia", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdSolicitudTelefonia != null)
                sqlParm[0].Value = oSolicitudTelefonia.IdSolicitudTelefonia;
            else
                sqlParm[0].Value = DBNull.Value;

            sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdEmpleado != null)
                sqlParm[1].Value = oSolicitudTelefonia.IdEmpleado;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Fecha_Solicitud_Inicio", SqlDbType.DateTime);
            if (oSolicitudTelefonia.FechaSolicitudDesde.HasValue)
                sqlParm[2].Value = oSolicitudTelefonia.FechaSolicitudDesde;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Fecha_Solicitud_Fin", SqlDbType.DateTime);
            if (oSolicitudTelefonia.FechaSolicitudHasta.HasValue)
                sqlParm[3].Value = oSolicitudTelefonia.FechaSolicitudHasta;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Id_Operador", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdOperadorTelefonia != null)
                sqlParm[4].Value = oSolicitudTelefonia.IdOperadorTelefonia;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Id_Plan_Telefonia", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdPlanTelefonia != null)
                sqlParm[5].Value = oSolicitudTelefonia.IdPlanTelefonia;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdEstadoSolicitud != null)
                sqlParm[6].Value = oSolicitudTelefonia.IdEstadoSolicitud;
            else
                sqlParm[6].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_SOLICITUD_TELEFONIA",
                                                  sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaSolicitudTelefonia.Add(new SolicitudTelefoniaInfo(drd.GetString(0).Trim(),
                            drd.GetString(1).Trim(), new EmpleadoInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(), new AreaEmpleadoInfo(drd.GetString(3).Trim(), drd.GetString(4).Trim(), null), null, null),
                            drd.GetDateTime(5), drd.GetString(6).Trim(),
                            drd.GetString(7).Trim(), new OperadorTelefoniaInfo(drd.GetString(7).Trim(), drd.GetString(8).Trim()),
                            drd.GetString(9).Trim(), new OperadorPlanTelefoniaInfo(drd.GetString(9).Trim(), null, null, drd.GetString(10).Trim(), drd.GetString(11).Trim(), Int32.Parse(drd.GetValue(12).ToString()), drd.GetString(13).Trim(), Int32.Parse(drd.GetValue(14).ToString()), drd.GetString(15).Trim(), Int32.Parse(drd.GetValue(16).ToString()), drd.GetString(17).Trim(), Int32.Parse(drd.GetValue(18).ToString()), null),
                            drd.GetString(19).Trim(), new EstadoSolicitudInfo(drd.GetString(19).Trim(), drd.GetString(20).Trim()),
                            Int32.Parse(drd.GetValue(21).ToString()),
                            Int32.Parse(drd.GetValue(22).ToString()), Int32.Parse(drd.GetValue(23).ToString()), null, null, null, null, null,
                            drd.GetString(27).Trim(), new MotivoSolicitudTelefonoInfo(drd.GetString(27).Trim(), drd.GetString(28)),
                            drd.GetString(29).Trim(), new TipoTelefonoInfo(drd.GetString(29).Trim(), drd.GetString(30).Trim())
                                ));
                        }
                    }
                }
            }
            return oListaSolicitudTelefonia;

        }

        public SolicitudTelefoniaInfo Consultar(SolicitudTelefoniaInfo oSolicitudTelefonia)
        {
            var sqlParm = new SqlParameter[7];
            var oEntSolicitudTelefonia = new SolicitudTelefoniaInfo();

            sqlParm[0] = new SqlParameter("@Id_Solicitud_Telefonia", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdSolicitudTelefonia != null)
                sqlParm[0].Value = oSolicitudTelefonia.IdSolicitudTelefonia;
            else
                sqlParm[0].Value = DBNull.Value;

            sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdEmpleado != null)
                sqlParm[1].Value = oSolicitudTelefonia.IdEmpleado;
            else
                sqlParm[1].Value = DBNull.Value;

            sqlParm[2] = new SqlParameter("@Fecha_Solicitud_Inicio", SqlDbType.DateTime);
            if (oSolicitudTelefonia.FechaSolicitudDesde.HasValue)
                sqlParm[2].Value = oSolicitudTelefonia.FechaSolicitudDesde;
            else
                sqlParm[2].Value = DBNull.Value;

            sqlParm[3] = new SqlParameter("@Fecha_Solicitud_Fin", SqlDbType.DateTime);
            if (oSolicitudTelefonia.FechaSolicitudHasta.HasValue)
                sqlParm[3].Value = oSolicitudTelefonia.FechaSolicitudHasta;
            else
                sqlParm[3].Value = DBNull.Value;

            sqlParm[4] = new SqlParameter("@Id_Operador", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdOperadorTelefonia != null)
                sqlParm[4].Value = oSolicitudTelefonia.IdOperadorTelefonia;
            else
                sqlParm[4].Value = DBNull.Value;

            sqlParm[5] = new SqlParameter("@Id_Plan_Telefonia", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdPlanTelefonia != null)
                sqlParm[5].Value = oSolicitudTelefonia.IdPlanTelefonia;
            else
                sqlParm[5].Value = DBNull.Value;

            sqlParm[6] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
            if (oSolicitudTelefonia.IdEstadoSolicitud != null)
                sqlParm[6].Value = oSolicitudTelefonia.IdEstadoSolicitud;
            else
                sqlParm[6].Value = DBNull.Value;

            using (
                var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction,
                                                  CommandType.StoredProcedure, "SGA_SP_CONSULTAR_SOLICITUD_TELEFONIA",
                                                  sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        drd.Read();

                        oEntSolicitudTelefonia = new SolicitudTelefoniaInfo(drd.GetString(0).Trim(),
                            drd.GetString(1).Trim(), new EmpleadoInfo(drd.GetString(1).Trim(), drd.GetString(2).Trim(), drd.GetString(3).Trim(), new AreaEmpleadoInfo(drd.GetString(3).Trim(), drd.GetString(4).Trim(), null), null, null),
                            drd.GetDateTime(5), drd.GetString(6).Trim(),
                            drd.GetString(7).Trim(), new OperadorTelefoniaInfo(drd.GetString(7).Trim(), drd.GetString(8).Trim()),
                            drd.GetString(9).Trim(), new OperadorPlanTelefoniaInfo(drd.GetString(9).Trim(), null, null, drd.GetString(10).Trim(), drd.GetString(11).Trim(), Int32.Parse(drd.GetValue(12).ToString()), drd.GetString(13).Trim(), Int32.Parse(drd.GetValue(14).ToString()), drd.GetString(15).Trim(), Int32.Parse(drd.GetValue(16).ToString()), drd.GetString(17).Trim(), Int32.Parse(drd.GetValue(18).ToString()), null),
                            drd.GetString(19).Trim(), new EstadoSolicitudInfo(drd.GetString(19).Trim(), drd.GetString(20).Trim()),
                            Int32.Parse(drd.GetValue(21).ToString()),
                            Int32.Parse(drd.GetValue(22).ToString()), Int32.Parse(drd.GetValue(23).ToString()), null, null, null, null, null,
                            drd.GetString(27).Trim(), new MotivoSolicitudTelefonoInfo(drd.GetString(27).Trim(), drd.GetString(28)),
                            drd.GetString(29).Trim(), new TipoTelefonoInfo(drd.GetString(29).Trim(), drd.GetString(30).Trim())
                            );
                    }
                }
            }
            return oEntSolicitudTelefonia;
        }

        public bool Registrar(SolicitudTelefoniaInfo oSolicitudTelefonia, ref string sIdSolicitudTelefonia)
        {
            var sqlParm = new SqlParameter[13];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdEmpleado != null)
                        sqlParm[0].Value = oSolicitudTelefonia.IdEmpleado;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Fecha_Solicitud", SqlDbType.DateTime);
                    if (oSolicitudTelefonia.FechaSolicitud.HasValue)
                        sqlParm[1].Value = oSolicitudTelefonia.FechaSolicitud;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.Observaciones != null)
                        sqlParm[2].Value = oSolicitudTelefonia.Observaciones;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Id_Operador", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdOperadorTelefonia != null)
                        sqlParm[3].Value = oSolicitudTelefonia.IdOperadorTelefonia;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Id_Plan_Telefonia", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdPlanTelefonia != null)
                        sqlParm[4].Value = oSolicitudTelefonia.IdPlanTelefonia;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdEstadoSolicitud != null)
                        sqlParm[5].Value = oSolicitudTelefonia.IdEstadoSolicitud;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Minutos_Adicionales_Linea", SqlDbType.Int);
                    if (oSolicitudTelefonia.MinutosAdicionalesLinea.HasValue)
                        sqlParm[6].Value = oSolicitudTelefonia.MinutosAdicionalesLinea;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@SMS_Adicionales", SqlDbType.Int);
                    if (oSolicitudTelefonia.SmsAdicionales.HasValue)
                        sqlParm[7].Value = oSolicitudTelefonia.SmsAdicionales;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@Mb_Internet_Adicionales", SqlDbType.Int);
                    if (oSolicitudTelefonia.MbAdicionales.HasValue)
                        sqlParm[8].Value = oSolicitudTelefonia.MbAdicionales;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.UsuarioSistema != null)
                        sqlParm[9].Value = oSolicitudTelefonia.UsuarioSistema;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Id_Motivo_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdMotivoSolicitud != null)
                        sqlParm[10].Value = oSolicitudTelefonia.IdMotivoSolicitud;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    sqlParm[11] = new SqlParameter("@Id_Tipo_Telefono", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdTipoTelefono != null)
                        sqlParm[11].Value = oSolicitudTelefonia.IdTipoTelefono;
                    else
                        sqlParm[11].Value = DBNull.Value;

                    sqlParm[12] = new SqlParameter("@Id", SqlDbType.VarChar, 10) { Direction = ParameterDirection.Output };

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_REGISTRAR_SOLICITUD_TELEFONIA", sqlParm);
                    sIdSolicitudTelefonia = sqlParm[12].Value.ToString();
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }

        public bool Actualizar(SolicitudTelefoniaInfo oSolicitudTelefonia)
        {
            var sqlParm = new SqlParameter[13];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Solicitud_Telefonia", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdSolicitudTelefonia != null)
                        sqlParm[0].Value = oSolicitudTelefonia.IdSolicitudTelefonia;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Id_Empleado", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdEmpleado != null)
                        sqlParm[1].Value = oSolicitudTelefonia.IdEmpleado;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Fecha_Solicitud", SqlDbType.DateTime);
                    if (oSolicitudTelefonia.FechaSolicitud.HasValue)
                        sqlParm[2].Value = oSolicitudTelefonia.FechaSolicitud;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Observaciones", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.Observaciones != null)
                        sqlParm[3].Value = oSolicitudTelefonia.Observaciones;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    sqlParm[4] = new SqlParameter("@Id_Operador", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdOperadorTelefonia != null)
                        sqlParm[4].Value = oSolicitudTelefonia.IdOperadorTelefonia;
                    else
                        sqlParm[4].Value = DBNull.Value;

                    sqlParm[5] = new SqlParameter("@Id_Plan_Telefonia", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdPlanTelefonia != null)
                        sqlParm[5].Value = oSolicitudTelefonia.IdPlanTelefonia;
                    else
                        sqlParm[5].Value = DBNull.Value;

                    sqlParm[6] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdEstadoSolicitud != null)
                        sqlParm[6].Value = oSolicitudTelefonia.IdEstadoSolicitud;
                    else
                        sqlParm[6].Value = DBNull.Value;

                    sqlParm[7] = new SqlParameter("@Minutos_Adicionales", SqlDbType.Int);
                    if (oSolicitudTelefonia.MinutosAdicionalesLinea.HasValue)
                        sqlParm[7].Value = oSolicitudTelefonia.MinutosAdicionalesLinea;
                    else
                        sqlParm[7].Value = DBNull.Value;

                    sqlParm[8] = new SqlParameter("@SMS_Adicionales", SqlDbType.Int);
                    if (oSolicitudTelefonia.SmsAdicionales.HasValue)
                        sqlParm[8].Value = oSolicitudTelefonia.SmsAdicionales;
                    else
                        sqlParm[8].Value = DBNull.Value;

                    sqlParm[9] = new SqlParameter("@Mb_Internet_Adicionales", SqlDbType.Int);
                    if (oSolicitudTelefonia.MbAdicionales.HasValue)
                        sqlParm[9].Value = oSolicitudTelefonia.MbAdicionales;
                    else
                        sqlParm[9].Value = DBNull.Value;

                    sqlParm[10] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.UsuarioSistema != null)
                        sqlParm[10].Value = oSolicitudTelefonia.UsuarioSistema;
                    else
                        sqlParm[10].Value = DBNull.Value;

                    sqlParm[11] = new SqlParameter("@Id_Motivo_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdMotivoSolicitud != null)
                        sqlParm[11].Value = oSolicitudTelefonia.IdMotivoSolicitud;
                    else
                        sqlParm[11].Value = DBNull.Value;

                    sqlParm[12] = new SqlParameter("@Id_Tipo_Telofono", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdTipoTelefono != null)
                        sqlParm[12].Value = oSolicitudTelefonia.IdTipoTelefono;
                    else
                        sqlParm[12].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_SOLICITUD_TELEFONIA", sqlParm);
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }

        public bool Aprobar(SolicitudTelefoniaInfo oSolicitudTelefonia)
        {
            var sqlParm = new SqlParameter[4];

            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Solicitud_Telefonia", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdSolicitudTelefonia != null)
                        sqlParm[0].Value = oSolicitudTelefonia.IdSolicitudTelefonia;
                    else
                        sqlParm[0].Value = DBNull.Value;

                    sqlParm[1] = new SqlParameter("@Id_Estado_Solicitud", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.IdEstadoSolicitud != null)
                        sqlParm[1].Value = oSolicitudTelefonia.IdEstadoSolicitud;
                    else
                        sqlParm[1].Value = DBNull.Value;

                    sqlParm[2] = new SqlParameter("@Usuario_Aprobacion", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.UsuarioAprobacion != null)
                        sqlParm[2].Value = oSolicitudTelefonia.UsuarioAprobacion;
                    else
                        sqlParm[2].Value = DBNull.Value;

                    sqlParm[3] = new SqlParameter("@Usuario_Atencion", SqlDbType.VarChar);
                    if (oSolicitudTelefonia.UsuarioAtencion != null)
                        sqlParm[3].Value = oSolicitudTelefonia.UsuarioAtencion;
                    else
                        sqlParm[3].Value = DBNull.Value;

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_ESTADO_SOLICITUD_TELEFONIA", sqlParm);
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }

        #endregion
    }
}
